/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package queue;

import accessori.Node;
import exceptions.EmptyQueueException;

/**
 *
 * @author pc
 */
public class NodeQueue<E> implements Queue<E> {

    protected Node<E> front, rear; // riferimenti ai nodi head e tail 
    protected int size; // numero di elementi nello stack 

    public NodeQueue() {
        front = null;
        rear = null;
        size = 0;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public E front() throws EmptyQueueException {
        if(isEmpty()) throw new EmptyQueueException("Impossibile prelevare front, Queue vuota");
        return front.getElement();
    }

    @Override
    public void enqueue(E elem) {
        Node<E> node = new Node<E>();
        node.setElement(elem);
        node.setNext(null); // il nodo aggiunto diventa il nuovo nodo tail
        if (size == 0) {
            front = node; // caso in cui la lista e` vuota 
        } else {
            rear.setNext(node); // aggiungi nodo alla fine della lista 
        }
        rear = node; // aggiorna il riferimento al nodo tail 
        size++;
    }
    

    @Override
    public E dequeue() throws EmptyQueueException {
        if(isEmpty()) throw new EmptyQueueException("Impossibile eliminare nodo dalla queue, gia vuota!");
        E temp= front.getElement();
        front=front.getNext();
        size--;
        return temp;
    }
}
